﻿#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>



//计算日期到天数转换
//https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded
//int main()
//{
//    int y = 0, m = 0, d = 0;
//    int day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//
//    while (cin >> y >> m >> d)
//    {
//        int flag = 0;
//        for (int i = 1; i < m; ++i)
//        {
//            if (i == 2 && ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)))
//            {
//                flag += 1;
//            }
//            flag += day[i];
//        }
//        cout << flag + d << endl;
//    }
//}


//幸运的袋子
//https://www.nowcoder.com/questionTerminal/a5190a7c3ec045ce9273beebdfe029ee
size_t getLuckySack(const vector<long>& v, size_t step, int sum, int prod)
{
    int ret = 0;
    for (int i = step; i < v.size(); ++i) //开始计算加数和乘积 - 从step步开始，继续向后递归
    {
        int isum = sum + v[i];
        int iprod = prod*v[i];

        if (isum > iprod) //如果a+b > ab 则ret+1继续递归
        {
            ret += 1 + getLuckySack(v, i + 1, isum , iprod);
        }
        else if (v[i] == 1) //如果v[i]为1 则下一个数一定满足a+b > ab 的要求 下一个递归会满足上面if的条件
        {
            ret += getLuckySack(v, i + 1, isum , iprod); //继续递归
        }
        else break; //如果上面两个条件都不满足则跳出 因为是经过排序的，如果当前位置的数不满足，后面的数越来越大更不满足，此时剪枝停止递归

        while (i < v.size() - 1 && v[i] == v[i + 1]) { ++i; } //第一轮递归后进行去重然后进行第二轮递归
    }
    return ret;
}

int main()
{
    int num = 0;
    cin >> num;
    vector<long> v(num, 0);
    for (auto& n : v) { cin >> n; }
    sort(v.begin(), v.end());
    cout << getLuckySack(v, 0, 0, 1) << endl;
    return 0;
}